#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>


int main()
{
    printf("I am a process, pid: %d\n",getpid());
    
    pid_t id = fork();
    if(id == 0)
    {
        printf("Child process, pid: %d, ppid: %d\n",getpid(), getppid());
        
        //子进程来实现进程替换
        sleep(1);

        printf("exec begin...\n");
        
        
        
        
        //这是在调用指令
        //execl("/usr/bin/ls","ls","-a","-l",NULL);   //NULL   不是"NULL
        //execl("/usr/bin/top","ls","-a","-l",NULL); 
        
        //以下是替换自己写的进程
        //调用c++写的程序
        //execl("./mytestcpp","mytestcpp",NULL); //不传环境变量，原来的进程是能继承得到的，但是在进程替换后，会不会被替换掉呢，这里的实验结果为能拿得到，则没有被替换掉

        execle("./mytestcpp","mytestcpp",NULL, env);// 可以设置一种全新的环境变量 
        
        //execl("./mytestcpp","mytestcpp","-a","-b","-c",NULL); 
        //execl("/usr/bin/python3", "python3", "test.py", NULL);
        //execl("/usr/bin/bash", "bash", "test.sh", NULL);execl("./mytestpy","mytestpy","-a","-b","-c",NULL); 
        printf("exec end...\n");//一旦程序替换成功，后面代码就不再执行
        exit(1);
    
    
    
    }

    // 即使子进程被替换，父进程仍然要读取子进程的退出信息
    pid_t rid = waitpid(id, NULL, 0);
    if(rid>0)
    {
        printf("wait success\n");
    }
}

























//--------------------------------------
//typedef void(*fun_t)();
//fun_t tasks[NUM];
//
//void Print01()
//{
//    printf("this is printf01\n");
//}
//
//void Print02()
//{
//    printf("this is printf02\n");
//}
//
//void Print03()
//{
//    printf("this is printf03\n");
//}
//
//
//
//void initTask()
//{
//    tasks[0] = print01;
//    tasks[1] = print02;
//    tasks[2] = print03;
//    tasks[3] = NULL;
//}
//
//void  excuteTask()
//{
//    for(int i=0; tasks[i]; i++) tasks[i]();
//}
//
//
//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        int cnt = 50;
//        while(cnt)
//        {
//
//            printf("I am a child process, pid: %d, ppid: %d, cnt: %d\n",getpid(),getppid(),cnt);
//            cnt--;
//            sleep(1);
//
//
//           // int *p = NULL;
//           // *p = 100;
//            // a/=0;
//        }
//
//        sleep(1);
//        exit(0);
//    }
//
//    // 非阻塞等待       第三个参数是一个宏WONHANG
//    int status=0;
//    pid_t rid = waitpid(id, &status, WNOHANG);
//    if(rid > 0)
//    {
//
//    }   
//    else if(rid == 0)
//    {
//        printf("*************** task begin  ******************\n");
//        printf("child is running, you can do some other things\n");
//        excuteTask();
//        printf("**************** task end  *******************\n");
//    }
//    else 
//    {
//
//    }
//    int status=0;
//    pid_t rid = waitpid(id, &status, 0);
//    if(rid > 0)
//    {
//
//        if(WIFEXITED(status))
//        {
//             printf("wait success, rid: %d, status: %d,exit signo: %d, exit code: %d\n", rid, status, WEXITSTATUS(status));
//        }
//        else
//        {
//            printf("child is error\n");
//        }
//    }
//
   // int status=0;
   // pid_t rid = waitpid(id, &status, 0);
   // if(rid > 0)
   // {
   //     //拿到status的两个低8位来看一下
   //     printf("wait success, rid: %d, status: %d,exit signo: %d, exit code: %d\n", rid, status, status&0x7F, (status>>8)&0xFF);
   // }




//    return 0;
//}

